iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 5
1
Modern Web

Go into Web!系列 第 5

Day5 | Gin - 好用的 web framework

  • 分享至 

  • xImage
  •  

昨天簡單介紹了如何利用 net/http 加上 html/template 這兩個 package 建立一個簡單的網站,但是在開發一個網站不是只有這麼簡單的事情,還需要考慮許多不同的情境,,例如 middleware、response 的格式、request 資料驗證 等等,這時候 framework 就是我們的好朋友拉,今天就來介紹 gin 這套好用的框架!

為什麼要用 gin

使用 golang 所開發出來的 web framework 有很多中,為什麼我偏偏要挑選 gin 呢?
原因很簡單,就讓我們先看幾個比較資料


圖片來源:https://hackernoon.com/the-myth-about-golang-frameworks-and-external-libraries-93cb4b7da50f


圖片來源:http://qwding.github.io/post/golang_framwork_pk/


圖片來源:https://www.mindinventory.com/blog/top-web-frameworks-for-development-golang/

從以上幾個分析資料得出讓我使用 gin 的原因如下

  1. 在 Github 上的 Star 數目前最高,就是大家都公認好用的
  2. Response 的速度最快
  3. CPU 的消耗只輸 echo 一點點,記憶體的表現是全部裡面最好的

一個大家公認好用Response 回應速度最快 與效能表現上最好的框架不用嗎?

接下來就開始進入 gin 的世界吧

Gin

簡介

Gin 是一套使用 golang 打造的 web 框架,官方自己的介紹如下

Gin is a web framework written in Golang.
It features a martini-like API with much better performance, up to 40 times faster.
If you need performance and good productivity, you will love Gin.

為甚麼說是 martini-like API 呢? 原因是為 martini 也是一款使用 golang 寫的 web framework,gin 就是基於他的設計原理打造,但是效能比 martini 還要強大框架,關於 martini 的簡介在這裡

[備註] 由於 martini 目前已經沒有繼續維護了

gin 主要的特點如下

  1. 優秀的性能表現
  2. 基於原生的 net/http package 進行封裝
  3. 使用極其快速的 httprouter連結在此
  4. 優良設計的 middleware 機制
  5. http request 與 response 的驚喜包 - gin.Context
  6. 優良的 data binding 機制

看完以上特性之後是不是很心動呢?

就讓我們開始使用吧!

安裝

golang 在使用外來的 package 時就使用 go get 的指令就可以輕鬆的 package 下載下來並且安裝
讓我們使用以下的 command 將 gin 安裝到自己的 package 當中

go get github.com/gin-gonic/gin

快速開始使用

匯入 gin package

一開始要使用 gin 不外乎與 net/http package 一樣需要進行 import,因此我們就先將這兩個 package 進行 import

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

加入 request handler

如同簡介中所提到的, gin 在處理 request 與 response 都用一個萬用的 gin.Context 就可以拉,就讓我們延續昨天的範例,回傳一個 HTML

func test(c *gin.Context) {
	data := new(IndexData)
	data.Title = "首頁"
	data.Content = "我的第一支 gin 專案"
	c.HTML(http.StatusOK, "index.html", data)
}

[備註] IndexData 為昨天範例中所實作的 struct,有興趣的同學可以看昨天的文章~

從以上範例可以看出,gin.Context 可以直接輸出 HTML,裡面的參數依序是

  1. response http status code
  2. html template 檔案
  3. template 內的參數

當然他也可以支援許多不同的形態·如

  • String
  • JSON
  • XML
  • YAML
  • ProtoBuf
  • Redirect

幾乎目前主流的型態都支援到了,這讓我們在開發的時候可以省去許多處理回傳型態的時間,只要專注的開發功能即可。

設定 gin 的啟動程式

設定 instance

首先,我們要在 main 方法中建立 gin 的 instance,我們可以把這個 instance 想像成是 server 的實例

server := gin.Default()

設定 html template loader

設定好實例之後,我們來設定讀取 HTML Template,因為上一部的範例是要輸出 html,因此在這邊要先跟 gin 註冊好 template 的位置,好讓他去找

[備註]我們將 index.html 放在 template 的目錄底下

server.LoadHTMLGlob("template/*")

設定 http routing

接著,就來設定 routing 了,gin 原生提供了封裝各種 http method 的 routing,本範例用到了 HTTP GET 方法,程式如下

server.GET("/", test)

從上方的程式可以看出,只要讓 gin 的 instance 執行 GET 方法,依序輸入 routing 與相對應的 request handler 後,就可以進行綁定,真的是相當的方便。

gin 所提供的 http method 如下

  • GET
  • POST
  • PUT
  • PATCH
  • DELETE
  • OPTIONS

gin 幫我們把會用到 http method 都封裝好,這邊也只要呼叫要用到的方法即可,真的是太讚拉!

啟動 gin server

gin 也提供的簡潔的啟動方法,只需要單純的把 gin 的 instance 進行 Run() 方法即可,相關程式如下

server.Run(":8888")

將以上的程式結合起來如下

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

type IndexData struct {
	Title   string
	Content string
}

func test(c *gin.Context) {
	data := new(IndexData)
	data.Title = "首頁"
	data.Content = "我的第一個首頁"
	c.HTML(http.StatusOK, "index.html", data)
}
func main() {
	server := gin.Default()
	server.LoadHTMLGlob("template/*")
	server.GET("/", test)
	server.Run(":8888")
}

透過 go run main.go 的方法啟動後看到以下畫面就代表成功拉

小結

通過導入 gin 這個 web framework 來協助我們開發 web application,可以大大的加快我們開發的速度,如果對於 gin 想要更深入了解的人可以參考 官方文件

明天就讓我們來更進階的利用 gin 來實作其他的 HTTP METHOD 吧!

參考資料


上一篇
Day4 | 無痛使用 Golang 打造屬於自己的網頁
下一篇
Day6 | 透過 golang 實作一個簡單的登入功能
系列文
Go into Web!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言